package com.itany.nmms.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.itany.nmms.constant.DictConstant;
import com.itany.nmms.constant.StatusConstant;
import com.itany.nmms.dao.ProductTypeMapper;
import com.itany.nmms.entity.ProductType;
import com.itany.nmms.entity.ProductTypeExample;
import com.itany.nmms.exception.ProductTypeExistException;
import com.itany.nmms.exception.RequestParameterErrorException;
import com.itany.nmms.factory.ObjectFactory;
import com.itany.nmms.service.ProductTypeService;
import com.itany.nmms.util.ParameterUtil;

import java.util.List;

/**
 * @author 石小俊
 * @date 2023年11月09日 9:03
 */
public class ProductTypeServiceImpl implements ProductTypeService {
    @Override
    public void addType(String name) throws RequestParameterErrorException, ProductTypeExistException {
        ProductTypeMapper typeMapper = (ProductTypeMapper) ObjectFactory.getObject("typeMapper");
        if (ParameterUtil.isNull(name)) {
            throw new RequestParameterErrorException("请求参数有误");
        }

        // 商品类型的名称不能重复
        // 根据商品类型名称进行查询
        ProductTypeExample example = new ProductTypeExample();
        example.or()
                .andNameEqualTo(name);
        List<ProductType> types = typeMapper.selectByExample(example);
        // 如果查询到数据了,则说明已经存在了
        if (!types.isEmpty()) {
            // 抛出异常
            throw new ProductTypeExistException("该商品类型已经存在");
        }

        // 如果不存在,则正常添加
        ProductType type = new ProductType();
        type.setName(name);
        // 添加商品类型时,需要为其状态设置一个默认值
        type.setStatus(StatusConstant.PRODUCT_TYPE_STATUS_ENABLED);
        typeMapper.insertSelective(type);
    }

    @Override
    public PageInfo<ProductType> findPage(String pageNo, String pageSize) {
        ProductTypeMapper typeMapper = (ProductTypeMapper) ObjectFactory.getObject("typeMapper");

        // 对于分页相关信息设置默认值
        if (ParameterUtil.isNull(pageNo)) {
            pageNo = DictConstant.PRODUCT_TYPE_DEFAULT_PAGE_NO;
        }
        if (ParameterUtil.isNull(pageSize)) {
            pageSize = DictConstant.PRODUCT_TYPE_DEFAULT_PAGE_SIZE;
        }

        // 开始分页,使用pageHelper分页插件执行分页功能
        // 共分为三步
        // 1.导入插件依赖
        // pagehelper-4.1.6.jar
        // jsqlparser-1.0.jar
        // 2.配置分页插件
        // 在configuration配置中对插件进行配置
        // 配置文件直接写在configuration配置中即可
        // 3.在代码中实现分页功能
        // 在代码中实现时又分为三步

        // 第一步:设置分页信息
        PageHelper.startPage(Integer.parseInt(pageNo), Integer.parseInt(pageSize));

        // 第二步:获取业务数据
        List<ProductType> types = typeMapper.selectByExample(new ProductTypeExample());

        // 第三步:封装分页对象
        PageInfo<ProductType> typePage = new PageInfo<>(types);
        return typePage;
    }

    @Override
    public ProductType findById(String id) throws RequestParameterErrorException {
        ProductTypeMapper typeMapper = (ProductTypeMapper) ObjectFactory.getObject("typeMapper");
        if (ParameterUtil.isNull(id)) {
            throw new RequestParameterErrorException("请求参数有误");
        }
        ProductType type = typeMapper.selectByPrimaryKey(Integer.parseInt(id));
        return type;
    }

    @Override
    public void modifyName(String id, String name) throws RequestParameterErrorException, ProductTypeExistException {
        ProductTypeMapper typeMapper = (ProductTypeMapper) ObjectFactory.getObject("typeMapper");
        if (ParameterUtil.isNull(id) || ParameterUtil.isNull(name)) {
            throw new RequestParameterErrorException("请求参数有误");
        }
        // 修改后的名称不能重复,但是可以是原来的
        // 即:当数据库中已经存在该名称且不是当前名称,则抛出异常
        ProductTypeExample example = new ProductTypeExample();
        example.or()
                .andNameEqualTo(name) // 数据库已经存在
                .andIdNotEqualTo(Integer.parseInt(id)); // 不是当前的数据
        List<ProductType> types = typeMapper.selectByExample(example);
        if (!types.isEmpty()) {
            throw new ProductTypeExistException("该商品类型已经存在");
        }
        ProductType type = new ProductType();
        type.setId(Integer.parseInt(id));
        type.setName(name);
        // 使用动态sql进行修改
        typeMapper.updateByPrimaryKeySelective(type);
    }

    @Override
    public void modifyStatus(String id) throws RequestParameterErrorException {
        ProductTypeMapper typeMapper = (ProductTypeMapper) ObjectFactory.getObject("typeMapper");
        if (ParameterUtil.isNull(id)) {
            throw new RequestParameterErrorException("请求参数有误");
        }
        // 根据主键查询当前商品类型信息
        ProductType type = typeMapper.selectByPrimaryKey(Integer.parseInt(id));
        // 如果当前状态为启用
        if (StatusConstant.PRODUCT_TYPE_STATUS_ENABLED == type.getStatus()) {
            // 将其状态改为禁用
            type.setStatus(StatusConstant.PRODUCT_TYPE_STATUS_DISABLED);
        } else {
            // 否则将其状态改为启用
            type.setStatus(StatusConstant.PRODUCT_TYPE_STATUS_ENABLED);
        }

        // 执行修改操作
        typeMapper.updateByPrimaryKeySelective(type);
    }

    @Override
    public List<ProductType> findEnable() {
        ProductTypeMapper typeMapper = (ProductTypeMapper) ObjectFactory.getObject("typeMapper");
        ProductTypeExample example = new ProductTypeExample();
        example.or()
                .andStatusEqualTo(StatusConstant.PRODUCT_TYPE_STATUS_ENABLED);
        List<ProductType> types = typeMapper.selectByExample(example);
        return types;
    }
}
